package mx.ipn.persistencia.mysql;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.dao.FacturaDAO;
import mx.ipn.to.FacturaTO;
import mx.ipn.to.FechaHoraTO;

public class FacturaDAOMySQL implements FacturaDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(FacturaDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO factura (nota,rfc,fecha,iva,tarifa,total) VALUES(?,?,?,?,?,?)";
	private static final String DELETE = "DELETE FROM factura WHERE id_factura=?";
	private static final String UPDATE = "UPDATE factura SET rfc=?,nota=?,fecha=?,iva=?,tarifa=?,total=? WHERE id_factura=?";
	private static final String FINDBYID = "SELECT * FROM factura WHERE id_factura=?";
	private static final String FINDBYFECHA = "SELECT * FROM factura WHERE fecha=?";
	private static final String FINDBYMA = "SELECT * FROM factura WHERE month(fecha)=? and year(fecha)=?";
	private static final String SELECT = "SELECT * FROM factura";
	@Override
	public short deleteFactura(int idFactura) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idFactura);

			ps.executeUpdate();
			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short)-1;
		}
	}
	@Override
	public FacturaTO findFacturaByFecha(java.sql.Date fecha) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYFECHA);

			ps.setDate(1, fecha);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				int idFactura = rs.getInt("id_factura");
				String nota = rs.getString("nombre");
				String rfc = rs.getString("rfc");
				float iva = rs.getFloat("iva");
				float tarifa = rs.getFloat("tarifa");
				float total = rs.getFloat("total");

				FacturaTO facturaTO = new FacturaTO(idFactura, nota,rfc,fecha,iva,tarifa,total);
				ps.close();
				conexion.close();
				return facturaTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public FacturaTO findFacturaById(int idFactura) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idFactura);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				String nota = rs.getString("nota");
				String rfc = rs.getString("rfc");
				java.sql.Date fecha = rs.getDate("fecha");
				float iva = rs.getFloat("iva");
				float tarifa = rs.getFloat("tarifa");
				float total = rs.getFloat("total");

				FacturaTO facturaTO = new FacturaTO(idFactura, nota,rfc,fecha,iva,tarifa,total);
				ps.close();
				conexion.close();
				return facturaTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public boolean insertFactura(FacturaTO facturaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, facturaTO.getNota());
			ps.setString(2, facturaTO.getRegistro());
			ps.setDate(3, FechaHoraTO.getFecha(facturaTO.getFecha()));
			//ps.setString(3, facturaTO.getFecha().toString());
			ps.setDouble(4, facturaTO.getIva());
			ps.setDouble(5, facturaTO.getTarifa());
			ps.setDouble(6, facturaTO.getTotal());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	public ArrayList<FacturaTO> findFacturaByMA(int mes, int anio){
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYMA);
			/*ps.setInt(1, Integer.parseInt(String.valueOf(rfecha.getValor("mes"))));
			ps.setInt(2, Integer.parseInt(String.valueOf(rfecha.getValor("anio"))));*/
			ps.setInt(1, mes);
			ps.setInt(2, anio);
			ResultSet rs = ps.executeQuery();

			ArrayList<FacturaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<FacturaTO>();

				int idFactura = rs.getInt("id_factura");
				String nota = rs.getString("nota");
				String rfc = rs.getString("rfc");
				java.sql.Date fecha = rs.getDate("fecha");
				float iva = rs.getFloat("iva");
				float tarifa = rs.getFloat("tarifa");
				float total = rs.getFloat("total");

				FacturaTO facturaTO = new FacturaTO(idFactura, nota,rfc,fecha,iva,tarifa,total);
				coleccion.add(facturaTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public ArrayList<FacturaTO> selectFactura() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			ArrayList<FacturaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<FacturaTO>();

				int idFactura = rs.getInt("id_factura");
				String nota = rs.getString("nota");
				String rfc = rs.getString("rfc");
				java.sql.Date fecha = rs.getDate("fecha");
				float iva = rs.getFloat("iva");
			    float tarifa = rs.getFloat("tarifa");
				float total = rs.getFloat("total");

				FacturaTO facturaTO = new FacturaTO(idFactura, nota,rfc,fecha,iva,tarifa,total);
				coleccion.add(facturaTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public short updateFactura(FacturaTO facturaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);
			
			ps.setString(1,facturaTO.getRegistro());
			ps.setString(2, facturaTO.getNota());
			ps.setDate(3, FechaHoraTO.getFecha(facturaTO.getFecha()));
			ps.setDouble(4, facturaTO.getIva());
			ps.setDouble(5, facturaTO.getTarifa());
			ps.setDouble(6, facturaTO.getTotal());
			ps.setInt(7, facturaTO.getIdFactura());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short)-1;
		}
	}
	public int getIdFactura(){
		int id=0;
		try {
		Connection conexion = FabricaDeDAOsMySQL.crearConexion();

		PreparedStatement ps = conexion.prepareStatement(SELECT);

		ResultSet rs = ps.executeQuery();
		rs.last();
		id=rs.getInt("id_factura");
	    ps.close();
	    conexion.close();
	    return id;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}
	
}
